_ = require 'underscore'

# 获取-角色对应的资源数组
getRolesRes = (roles) ->
  tmpResInfo = []
  tmpObj = {}
  if roles and roles?.length > 0
    for role in roles
      resArr = role?.resources or null
      if resArr
        for resInfo in resArr
          if resInfo and resInfo?.res_id
            tmpObj = _.pick resInfo, 'res_id'
            tmpResInfo.push tmpObj?.res_id
  return tmpResInfo

# 校验权限
checkAuth = (req, res, next) ->
  # 用户信息
  userSession = req?.session?.user or null

  if not userSession
    return res.status(403).json({'error':'对不起，用户未登录，禁止访问！'})

  # 用户角色列表
  roles = userSession?.roles or null

  # 若用户未设置角色，则禁止访问
  if not roles
    return res.status(403).json({'error':'对不起，用户未设置角色，禁止访问！'})

  tmpResInfo = getRolesRes roles

  # 若角色未设置权限，则禁止访问
  if 0 is tmpResInfo?.length
    return res.status(403).json({'error':'对不起，角色未设置权限，禁止访问！'})

  # 当前资源标识
  currResId = req?.query?.res_id or ''
  if not /^[0-9]*[1-9][0-9]*$/.test(currResId)
    return res.status(500).json({'error':'对不起，传入资源标识(res_id)不是合法数字！'})

  # 若当前资源标识不传，则禁止访问
  if not currResId
    return res.status(403).json({'error':'对不起，URL需带上资源标识(res_id)，禁止访问！'})

  hasAuth = _.contains tmpResInfo, parseInt(currResId, 10)

  # 资源列表数组不包含当前资源标识，则禁止访问
  if not hasAuth
    return res.status(403).json({'error':'对不起，你没有访问该资源的权限！'})
  else
    return next()


# 校验权限
checkAuthBack = (req, res, next) ->
  # 用户信息
  userSession = req?.session?.user_back or null

  if not userSession
    return res.status(403).json({'error':'对不起，用户未登录，禁止访问！'})

  # 用户角色列表
  roles = userSession?.roles or null

  # 若用户未设置角色，则禁止访问
  if not roles
    return res.status(403).json({'error':'对不起，用户未设置角色，禁止访问！'})

  tmpResInfo = getRolesRes roles

  # 若角色未设置权限，则禁止访问
  if 0 is tmpResInfo?.length
    return res.status(403).json({'error':'对不起，角色未设置权限，禁止访问！'})

  # 当前资源标识
  currResId = req?.query?.res_id or ''
  if not /^[0-9]*[1-9][0-9]*$/.test(currResId)
    return res.status(500).json({'error':'对不起，传入资源标识(res_id)不是合法数字！'})

  # 若当前资源标识不传，则禁止访问
  if not currResId
    return res.status(403).json({'error':'对不起，URL需带上资源标识(res_id)，禁止访问！'})

  hasAuth = _.contains tmpResInfo, parseInt(currResId, 10)

  # 资源列表数组不包含当前资源标识，则禁止访问
  if not hasAuth
    return res.status(403).json({'error':'对不起，你没有访问该资源的权限！'})
  else
    return next()

# 校验登录
checkIsLogin = (req, res, next) ->
  if not req.session['user']
    return res.status(403).json({'error':'对不起，你还未登录，禁止访问！'})
  else
    return next()

# 后端校验登录
checkIsLoginBack = (req, res, next) ->
  if not req.session['user_back']
    return res.status(403).json({'error':'对不起，你还未登录，禁止访问！'})
  else
    return next()

# 校验web_token
checkWbAuth = (req, res, next)->
  #页面获取到的token
  curr_token = req.params?.wb_token or req.body?.wb_token or req.headers?.wb_token
  if not curr_token
    return res.satus(403).json({'error':'对不起，你没有权限！'})
  if curr_token == '51D04E9970ADD9904951D34B7E529B0F'
    return next()

# 校验权限
module.exports.checkAuth = checkAuth
# 后端校验权限
module.exports.checkAuthBack = checkAuthBack

# 校验登录
module.exports.checkIsLogin = checkIsLogin
# 后端校验登录
module.exports.checkIsLoginBack = checkIsLoginBack
# 校验web_token
module.exports.checkWbAuth = checkWbAuth